home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Over 1,000 Windows 95 Programs
/
Over 1000 Windows 95 Programs (Microforum) (Disc 1).iso
/
odbc
/
instcat.sql
< prev
next >
Wrap
Text File
|
1995-08-07
|
138KB
|
4,621 lines
/*
** INSTCAT.SQL
** Installs catalog stored procedures on the Microsoft SQL Server.
** Copyright 1992-1995, Microsoft Corp. All rights reserved.
*/
/*
NOTE: you MUST change the last row inserted into spt_server_info
to be version number of this file. the convention is j.nn.bbb, where
jj is the major version number ('6' now), nn is the minor version number
('00' now), and bbb is the build number.
*/
/****************************************************************************/
/* This portion sets up the ability to perform all the functions in this */
/* script */
/****************************************************************************/
use master
go
dump tran master with no_log
go
if exists (select * from sysobjects
where name = 'sp_configure' and sysstat & 0xf = 4)
begin
execute sp_configure 'update',1
end
reconfigure with override
go
/*
** If old versions of tables exist, drop them.
*/
if (exists (select * from sysobjects
where name = 'MSdatatype_info' and sysstat & 0xf = 3))
drop table MSdatatype_info
go
if (exists (select * from sysobjects
where name = 'MSdatatype_info_ext' and sysstat & 0xf = 3))
drop table MSdatatype_info_ext
go
if (exists (select * from sysobjects
where name = 'MStable_types' and sysstat & 0xf = 3))
drop table MStable_types
go
if (exists (select * from sysobjects
where name = 'MSserver_info' and sysstat & 0xf = 3))
drop table MSserver_info
go
if (exists (select * from sysobjects
where name = 'spt_table_types' and sysstat & 0xf = 3))
drop table spt_table_types /* no longer used */
go
/*
** If tables or procs already exist, drop them.
*/
if (exists (select * from sysobjects
where name = 'spt_datatype_info' and sysstat & 0xf = 3))
drop table spt_datatype_info
go
if (exists (select * from sysobjects
where name = 'spt_datatype_info_ext' and sysstat & 0xf = 3))
drop table spt_datatype_info_ext
go
if (exists (select * from sysobjects
where name = 'spt_server_info' and sysstat & 0xf = 3))
drop table spt_server_info
go
if (exists (select * from sysobjects
where name = 'sp_tables' and sysstat & 0xf = 4))
drop proc sp_tables
go
if (exists (select * from sysobjects
where name = 'sp_statistics' and sysstat & 0xf = 4))
drop proc sp_statistics
go
if (exists (select * from sysobjects
where name = 'sp_columns' and sysstat & 0xf = 4))
drop proc sp_columns
go
if (exists (select * from sysobjects
where name = 'sp_fkeys' and sysstat & 0xf = 4))
drop proc sp_fkeys
go
if (exists (select * from sysobjects
where name = 'sp_pkeys' and sysstat & 0xf = 4))
drop proc sp_pkeys
dump tran master with no_log
go
go
if (exists (select * from sysobjects
where name = 'sp_stored_procedures' and sysstat & 0xf = 4))
drop proc sp_stored_procedures
go
if (exists (select * from sysobjects
where name = 'sp_sproc_columns' and sysstat & 0xf = 4))
drop proc sp_sproc_columns
go
if (exists (select * from sysobjects
where name = 'sp_table_privileges' and sysstat & 0xf = 4))
drop proc sp_table_privileges
go
if (exists (select * from sysobjects
where name = 'sp_column_privileges' and sysstat & 0xf = 4))
drop proc sp_column_privileges
go
if (exists (select * from sysobjects
where name = 'sp_server_info' and sysstat & 0xf = 4))
drop proc sp_server_info
go
if (exists (select * from sysobjects
where name = 'sp_datatype_info' and sysstat & 0xf = 4))
drop proc sp_datatype_info
go
if (exists (select * from sysobjects
where name = 'sp_special_columns' and sysstat & 0xf = 4))
drop proc sp_special_columns
go
if (exists (select * from sysobjects
where name = 'sp_databases' and sysstat & 0xf = 4))
drop proc sp_databases
go
dump tran master with no_log
go
print 'creating table spt_datatype_info_ext'
go
create table spt_datatype_info_ext (
user_type smallint not null,
create_params varchar(32) null,
auto_increment smallint null)
go
create unique clustered index datatypeinfoextclust on spt_datatype_info_ext(user_type,auto_increment)
go
grant select on spt_datatype_info_ext to public
go
insert into spt_datatype_info_ext
/* CHAR user_type, create_params, auto_increment */
values (1, 'length' ,0)
insert into spt_datatype_info_ext
/* VARCHAR user_type, create_params, auto_increment */
values (2, 'max length' ,0)
insert into spt_datatype_info_ext
/* BINARY user_type, create_params, auto_increment */
values (3, 'length' ,0)
insert into spt_datatype_info_ext
/* VARBINARY user_type, create_params, auto_increment */
values (4, 'max length' ,0)
if (charindex('6.00', @@version) > 0)
begin /* Add 6.0 data types */
insert into spt_datatype_info_ext
/* DECIMAL user_type, create_params, auto_increment */
values (26, 'precision,scale' ,0)
insert into spt_datatype_info_ext
/* NUMERIC user_type, create_params, auto_increment */
values (25, 'precision,scale' ,0)
insert into spt_datatype_info_ext
/* DECIMAL IDENTITY user_type, create_params, auto_increment */
values (26, 'precision' ,1)
insert into spt_datatype_info_ext
/* NUMERIC IDENTITY user_type, create_params, auto_increment */
values (25, 'precision' ,1)
end
else /* Pre 6.0 server, add SYSNAME create param */
begin
insert into spt_datatype_info_ext
/* SYSNAME user_type, create_param, auto_increments */
values (18, 'max length' ,0)
end
go
print 'creating table spt_datatype_info'
go
create table spt_datatype_info (
ss_dtype tinyint not null,
type_name varchar(32) not null,
data_type smallint not null,
data_precision int null,
numeric_scale smallint null, /* min scale if 6.0 */
numeric_radix smallint null,
length int null,
literal_prefix varchar(32) null,
literal_suffix varchar(32) null,
create_params varchar(32) null,
nullable smallint not null,
case_sensitive smallint not null,
searchable smallint not null,
unsigned_attribute smallint null,
money smallint not null,
auto_increment smallint null,
local_type_name varchar(128) null,
aux int null,
numdec tinyint not null)
go
create unique clustered index datatypeinfoclust on spt_datatype_info(ss_dtype,auto_increment)
go
/*
There is a complicated set of SQL used to deal with
the SQL Server Null data types (MONEYn, INTn, etc.)
ISNULL is the only conditional SQL Server function that can be used
to differentiate between these types depending on size.
The aux column in the above table is used to differentiate
the null data types from the non-null types.
The aux column contains NULL for the null data types and 0 or delta
to be added to length to get precision (money types) for the non-null
data types.
The following SQL returns the contents of the aux column (0)
for the non-null data types and returns a variable non-zero
value for the null data types.
" I I I FFMMDD"
" 1 2 4 484848"
isnull(d.aux,ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)
The '2*(d.ss_dtype%35+1)+2-8/c.length' selects a specific character of
the substring mask depending on the null data type and its size, i.e.
null MONEY4 or null MONEY8. The character selected is then converted
to its binary value and an appropriate bias (i.e. 60) is subtracted to
return the correct non-zero value. This value may be used as a
constant, i.e. ODBC data type, precision, scale, etc., or used as an
index with a substring to pick out a character string, i.e. type name.
The comments above the substring mask denote which character is
selected for each null data type, i.e. In (INTn), Fn (FLOATn),
Mn (MONEYn) and Dn (DATETIMn).
*/
grant select on spt_datatype_info to public
go
/* Get case sensitivity */
if 'A' = 'A' /* create dummy begin block */
begin
declare @case smallint
select @case = 0
select @case = 1 where 'a' != 'A'
/* Local Binary */
insert into spt_datatype_info values
( 45 ,'binary',-2 ,null,null ,null,null,'0x',null,'length',1 ,0 ,2 ,null ,0 ,null,'binary',0,0)
/* Local Bit */
insert into spt_datatype_info values
( 50 ,'bit',-7 , 1 ,0 ,2 ,null,null,null,null,0 ,0 ,2 ,null ,0 ,null,'bit',0,0)
/* Local Char */
insert into spt_datatype_info values
( 47 ,'char',1 ,null,null ,null,null,'''','''','length',1 ,@case,3 ,null ,0 ,null,'char',0,0)
/* Local Datetime */
insert into spt_datatype_info values
( 61 ,'datetime',11 ,23 ,3 ,10 ,16 ,'''','''',null,1 ,0 ,3 ,null ,0 ,null,'datetime',0,0)
/* Local Smalldatetime */
insert into spt_datatype_info values
( 58 ,'smalldatetime',11 ,16 ,0 ,10 ,16 ,'''','''',null,1 ,0 ,3 ,null ,0 ,null,'smalldatetime',0,0)
/* Local Datetimn */
insert into spt_datatype_info values /* sql server type is 'datetimn' */
( 111 ,'smalldatetime',0 ,0 ,0 ,10 ,0 ,'''','''',null,1 ,0 ,3 ,null ,0 ,null,'datetime',null,0)
/* Local Float */
insert into spt_datatype_info values
( 62 ,'float',6 ,15 ,null ,10 ,null,null,null,null,1 ,0 ,2 ,0 ,0 ,0 ,'float',0,0)
/* Local RealFloat */
insert into spt_datatype_info values /* sql server type is 'floatn' */
( 109 ,'float real',0 ,0 ,null ,10 ,0 ,null,null,null,1 ,0 ,2 ,0 ,0 ,0 ,'real float',null,0)
/* Local Real */
insert into spt_datatype_info values
( 59 ,'real',7 ,7 ,null ,10 ,null,null,null,null,1 ,0 ,2 ,0 ,0 ,0 ,'real',0,0)
/* Local Smallmoney */
insert into spt_datatype_info values
( 122 ,'smallmoney',3 ,10 ,4 ,10 ,null,'$',null,null,1 ,0 ,2 ,0 ,1 ,0 ,'smallmoney',8,0)
/* Local Int */
insert into spt_datatype_info values
( 56 ,'int',4 ,10 ,0 ,10 ,null,null,null,null,1 ,0 ,2 ,0 ,0 ,0 ,'int',0,0)
/* Local Intn */
insert into spt_datatype_info values /* sql server type is 'intn' */
( 38 ,'smallint tinyint',0 ,0 ,0 ,10 ,0 ,null,null,null,1 ,0 ,2 ,0 ,0 ,0 ,'tinyint smallint',null,0)
/* Local Money */
insert into spt_datatype_info values
( 60 ,'money',3 ,19 ,4 ,10 ,null,'$',null,null,1 ,0 ,2 ,0 ,1 ,0 ,'money',13,0)
/* Local Moneyn */
insert into spt_datatype_info values /* sql server type is 'moneyn' */
( 110 ,'smallmoney',0 ,0 ,4 ,10 ,0 ,'$',null,null,1 ,0 ,2 ,0 ,1 ,0 ,'smallmoneymoney',null,0)
/* Local Smallint */
insert into spt_datatype_info values
( 52 ,'smallint',5 ,5 ,0 ,10 ,null,null,null,null,1 ,0 ,2 ,0 ,0 ,0 ,'smallint',0,0)
/* Local Text */
insert into spt_datatype_info values
( 35 ,'text',-1 ,2147483647,null ,null,2147483647,'''','''',null,1 ,@case,1 ,null ,0 ,null,'text',0,0)
/* Local Varbinary */
insert into spt_datatype_info values
( 37 ,'varbinary',-3 ,null,null ,null,null,'0x',null,'max length',1 ,0 ,2 ,null ,0 ,null,'varbinary',0,0)
/* Local Tinyint */
insert into spt_datatype_info values
( 48 ,'tinyint',-6 ,3 ,0 ,10 ,null,null,null,null,1 ,0 ,2 ,1 ,0 ,0 ,'tinyint',0,0)
/* Local Varchar */
insert into spt_datatype_info values
( 39 ,'varchar',12 ,null,null ,null,null,'''','''','max length',1 ,@case,3 ,null ,0 ,null,'varchar',0,0)
/* Local Image */
insert into spt_datatype_info values
( 34 ,'image',-4 ,2147483647,null ,null,2147483647,'0x',null,null,1 ,0 ,0 ,null ,0 ,null,'image',0,0)
if (charindex('6.00', @@version) > 0)
begin /* Add 6.0 data types */
/* Local Decimaln */
insert into spt_datatype_info values /* sql server type is 'decimaln' */
( 106 ,'decimal',3 ,38 ,0 ,10 ,null,null,null,'precision,scale',1 ,0 ,2 ,0 ,0 ,0 ,'decimal',0,1)
/* Local Numericn */
insert into spt_datatype_info values /* sql server type is 'numericn' */
( 108 ,'numeric',2 ,38 ,0 ,10 ,null,null,null,'precision,scale',1 ,0 ,2 ,0 ,0 ,0 ,'numeric',0,1)
/* Local Decimal */
insert into spt_datatype_info values /* sql server type is 'decimaln' */
( 55 ,'decimal',3 ,38 ,0 ,10 ,null,null,null,'precision,scale',1 ,0 ,2 ,0 ,0 ,0 ,'decimal',0,1)
/* Local Numeric */
insert into spt_datatype_info values /* sql server type is 'numericn' */
( 63 ,'numeric',2 ,38 ,0 ,10 ,null,null,null,'precision,scale',1 ,0 ,2 ,0 ,0 ,0 ,'numeric',0,1)
/* Identity attribute data types */
/* Identity Int */
insert into spt_datatype_info values
( 56 ,'int identity',4 ,10 ,0 ,10 ,null,null,null,null,0 ,0 ,2 ,0 ,0 ,1 ,'int identity',0,0)
/* Identity Smallint */
insert into spt_datatype_info values
( 52 ,'smallint identity',5 ,5 ,0 ,10 ,null,null,null,null,0 ,0 ,2 ,0 ,0 ,1 ,'smallint identity',0,0)
/* Identity Tinyint */
insert into spt_datatype_info values
( 48 ,'tinyint identity',-6 ,3 ,0 ,10 ,null,null,null,null,0 ,0 ,2 ,1 ,0 ,1 ,'tinyint identity',0,0)
/* Identity Decimaln */
insert into spt_datatype_info values /* sql server type is 'decmaln' */
( 106 ,'decimal() identity',3 ,38 ,0 ,10 ,null,null,null,'precision,scale',0 ,0 ,2 ,0 ,0 ,1 ,'decimal() identity',0,1)
/* Identity Numericn */
insert into spt_datatype_info values /* sql server type is 'decmaln' */
( 108 ,'numeric() identity',2 ,38 ,0 ,10 ,null,null,null,'precision,scale',0 ,0 ,2 ,0 ,0 ,1 ,'numeric() identity',0,1)
/* Identity Decimal */
insert into spt_datatype_info values /* sql server type is 'decmaln' */
( 55 ,'decimal() identity',3 ,38 ,0 ,10 ,null,null,null,'precision,scale',0 ,0 ,2 ,0 ,0 ,1 ,'decimal() identity',0,1)
/* Identity Numeric */
insert into spt_datatype_info values /* sql server type is 'decmaln' */
( 63 ,'numeric() identity',2 ,38 ,0 ,10 ,null,null,null,'precision,scale',0 ,0 ,2 ,0 ,0 ,1 ,'numeric() identity',0,1)
end
else /* Pre 6.0 server, remove money length adjustment */
begin
update spt_datatype_info set aux=0 where ss_dtype in (122,60)
end
end
go
dump tran master with no_log
go
print 'creating table spt_server_info'
go
create table spt_server_info (
attribute_id int NOT NULL,
attribute_name varchar(60) NOT NULL,
attribute_value varchar(255) NOT NULL)
go
create unique clustered index serverinfoclust on spt_server_info(attribute_id)
go
insert into spt_server_info
values (1,'DBMS_NAME','Microsoft SQL Server')
insert into spt_server_info
values (2,'DBMS_VER',@@version)
insert into spt_server_info
values (10,'OWNER_TERM','owner')
insert into spt_server_info
values (11,'TABLE_TERM','table')
insert into spt_server_info
values (12,'MAX_OWNER_NAME_LENGTH','30')
insert into spt_server_info
values (13,'TABLE_LENGTH','30')
insert into spt_server_info
values (14,'MAX_QUAL_LENGTH','30')
insert into spt_server_info
values (15,'COLUMN_LENGTH','30')
insert into spt_server_info
values (16,'IDENTIFIER_CASE','MIXED')
insert into spt_server_info
values (17,'TX_ISOLATION','2')
if (charindex('6.00', @@version) > 0)
begin /* Add 6.0 collation sequence */
insert into spt_server_info
select 18,'COLLATION_SEQ',
'charset='+t2.name+' sort_order='+t1.name
+' charset_num='+rtrim(convert(char(4),t1.csid))+
' sort_order_num='+rtrim(convert(char(4),t1.id))
from syscharsets t1, syscharsets t2, sysconfigures t3
where t1.csid=t2.id and t1.id=t3.value and t3.config=1123
end
else
begin /* Add 4.2x collation sequence */
insert into spt_server_info
select 18,"COLLATION_SEQ",
"charset="+t2.name+" sort_order="+t1.name
+" charset_num="+rtrim(convert(char(4),t1.csid))+
" sort_order_num="+rtrim(convert(char(4),t1.id))
from syscharsets t1, syscharsets t2, sysconfigures t3
where t1.csid=t2.id and t1.id=t3.value and t3.config=123
end
insert into spt_server_info
values (19,'SAVEPOINT_SUPPORT','Y')
insert into spt_server_info
values (20,'MULTI_RESULT_SETS','Y')
insert into spt_server_info
values (22,'ACCESSIBLE_TABLES','Y')
insert into spt_server_info
values (100,'USERID_LENGTH','30')
insert into spt_server_info
values (101,'QUALIFIER_TERM','database')
insert into spt_server_info
values (102,'NAMED_TRANSACTIONS','Y')
insert into spt_server_info
values (103,'SPROC_AS_LANGUAGE','Y')
insert into spt_server_info
values (104,'ACCESSIBLE_SPROC','Y')
insert into spt_server_info
values (105,'MAX_INDEX_COLS','16')
insert into spt_server_info
values (106,'RENAME_TABLE','Y')
insert into spt_server_info
values (107,'RENAME_COLUMN','Y')
insert into spt_server_info
values (108,'DROP_COLUMN','N')
insert into spt_server_info
values (109,'INCREASE_COLUMN_LENGTH','N')
insert into spt_server_info
values (110,'DDL_IN_TRANSACTION','N')
insert into spt_server_info
values (111,'DESCENDING_INDEXES','N')
insert into spt_server_info
values (112,'SP_RENAME','Y')
insert into spt_server_info
values (113,'REMOTE_SPROC','Y')
insert into spt_server_info
values (500,'SYS_SPROC_VERSION','6.00.120')
go
grant select on spt_server_info to public
go
print 'creating sp_tables'
go
create procedure sp_tables(
@table_name varchar(90) = null,
@table_owner varchar(90) = null,
@table_qualifier varchar(90) = null,
@table_type varchar(100) = null)
as
declare @type1 varchar(3)
declare @tableindex int
/* Special feature #1: enumerate databases when owner and name
are blank but qualifier is explicitly '%'. */
if @table_qualifier = '%' and
@table_owner = '' and
@table_name = ''
begin /* If enumerating databases */
select
table_qualifier = name,
table_owner = convert(varchar(32),null),
table_name = convert(varchar(32),null),
table_type = convert(varchar(12),null),
remarks = convert(varchar(254),null) /* Remarks are NULL */
from master..sysdatabases
where name != 'model' /* eliminate MODEL database */
order by table_qualifier
end
/* Special feature #2: enumerate owners when qualifier and name
are blank but owner is explicitly '%'. */
else if @table_qualifier = '' and
@table_owner = '%' and
@table_name = ''
begin /* If enumerating owners */
select distinct
table_qualifier = convert(varchar(32),null),
table_owner = user_name(uid),
table_name = convert(varchar(32),null),
table_type = convert(varchar(12),null),
remarks = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects
order by table_owner
end
/* Special feature #3: enumerate table types when qualifier, owner and
name are blank but table type is explicitly '%'. */
else if @table_qualifier = '' and
@table_owner = '' and
@table_name = '' and
@table_type = '%'
begin /* If enumerating table types */
select
table_qualifier = convert(varchar(32),null),
table_owner = convert(varchar(32),null),
table_name = convert(varchar(32),null),
table_type = rtrim(substring('SYSTEM TABLETABLE VIEW',(colid-1)*12+1,12)),
remarks = convert(varchar(254),null) /* Remarks are NULL */
from sysobjects o, syscolumns c
where o.id=c.id and o.name='sysusers' and colid<=3
end
else
begin /* end of special features -- do normal processing */
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin
if @table_qualifier = ''
begin /* If empty qualifier supplied */
/* Force an empty result set */
select @table_name = ''
select @table_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
end
if @table_type is null
begin /* Select all ODBC supported table types */
select @type1 = 'SUV'
end
else
begin
/* TableType is case sensitive if CS server */
select @type1 = null
if (charindex('''SYSTEM TABLE''',@table_type) != 0)
select @type1 = @type1 + 'S' /* Add System Tables */
if (charindex('''TABLE''',@table_type) != 0)
select @type1 = @type1 + 'U' /* Add User Tables */
if (charindex('''VIEW''',@table_type) != 0)
select @type1 = @type1 + 'V' /* Add Views */
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
else
begin
if (@table_owner is null) and (charindex('%', @table_name) = 0)
begin /* If owner not specified and table is specified */
if exists (select * from sysobjects
where uid = user_id()
and name = @table_name
and (type = 'U' or type = 'V' or type = 'S'))
begin /* Override supplied owner w/owner of table */
select @table_owner = user_name()
end
end
end
if @table_owner is null /* If no owner supplied, force wildcard */
select @table_owner = '%'
select
table_qualifier = db_name(),
table_owner = user_name(o.uid),
table_name = convert(varchar(32),o.name), /* make nullable */
table_type = rtrim(
substring('SYSTEM TABLE TABLE VIEW ',
(ascii(o.type)-83)*12+1,12)), /* 'S'=0,'U'=2,'V'=3 */
remarks = convert(varchar(254),null) /* Remarks are NULL */
from sysusers u, sysobjects o
where
o.name like @table_name
and user_name(o.uid) like @table_owner
and charindex(substring(o.type,1,1),@type1)! = 0 /* Only desired types */
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (
suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* outer join to correlate with all rows in sysobjects */
where p.id =* o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by table_type, table_qualifier, table_owner, table_name
end
go
grant execute on sp_tables to public
go
dump tran master with no_log
go
print 'creating sp_statistics'
go
CREATE PROCEDURE sp_statistics (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@index_name varchar(32) = '%',
@is_unique char(1) = 'N',
@accuracy char(1) = 'Q')
AS
DECLARE @indid int
DECLARE @lastindid int
DECLARE @table_id int
DECLARE @full_table_name char(70)
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @accuracy not in ('Q','E')
begin
raiserror 20002 'Illegal ''accuracy'' specified -- must be ''Q'' or ''E''.'
return
end
if @@trancount != 0
begin /* If inside a transaction */
raiserror 20003 'The procedure ''sp_statistics'' cannot be executed from within a transaction.'
return
end
create table #TmpIndex(
table_qualifier varchar(32) NULL,
table_owner varchar(32) NULL,
table_name varchar(32) NOT NULL,
index_qualifier varchar(32) null,
index_name varchar(32) null,
non_unique smallint null,
type smallint NOT NULL,
seq_in_index smallint null,
column_name varchar(32) null,
collation char(1) null,
index_id int null,
cardinality int null,
pages int null,
status smallint NOT NULL)
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
/* Start at lowest index id */
SELECT @indid = min(indid)
FROM sysindexes
WHERE id = @table_id
AND indid > 0
AND indid < 255
WHILE @indid != NULL
BEGIN
INSERT #TmpIndex /* Add all columns that are in index */
SELECT
DB_NAME(), /* table_qualifier */
USER_NAME(o.uid), /* table_owner */
o.name, /* table_name */
o.name, /* index_qualifier */
x.name, /* index_name */
0, /* non_unique */
1, /* SQL_INDEX_CLUSTERED */
colid, /* seq_in_index */
INDEX_COL(@full_table_name,indid,colid),/* column_name */
'A', /* collation */
@indid, /* index_id */
x.rows, /* cardinality */
x.dpages, /* pages */
x.status /* status */
FROM sysindexes x, syscolumns c, sysobjects o
WHERE
x.id = @table_id
AND x.id = o.id
AND x.id = c.id
AND c.colid < keycnt+(x.status&16)/16
AND x.indid = @indid
/*
** Now move @indid to the next index.
*/
SELECT @lastindid = @indid
SELECT @indid = NULL
SELECT @indid = min(indid)
FROM sysindexes
WHERE id = @table_id
AND indid > @lastindid
AND indid < 255
END
UPDATE #TmpIndex
SET non_unique = 1
WHERE status&2 != 2 /* If non-unique index */
UPDATE #TmpIndex
SET
type = 3, /* SQL_INDEX_OTHER */
cardinality = NULL,
pages = NULL
WHERE index_id > 1 /* If non-clustered index */
/* now add row for table statistics */
INSERT #TmpIndex
SELECT
DB_NAME(), /* table_qualifier */
USER_NAME(o.uid), /* table_owner */
o.name, /* table_name */
null, /* index_qualifier */
null, /* index_name */
null, /* non_unique */
0, /* SQL_TABLE_STAT */
null, /* seq_in_index */
null, /* column_name */
null, /* collation */
0, /* index_id */
x.rows, /* cardinality */
x.dpages, /* pages */
0 /* status */
FROM sysindexes x, sysobjects o
WHERE o.id = @table_id
AND x.id = o.id
AND (x.indid = 0 or x.indid = 1) /* If there are no indexes */
/* then table stats are in */
/* a row with indid =0 */
if @is_unique != 'Y' /* If all indexes desired */
SELECT
table_qualifier,
table_owner,
table_name,
non_unique,
index_qualifier,
index_name,
type,
seq_in_index,
column_name,
collation,
cardinality,
pages,
filter_condition = convert(varchar(128),null)
FROM #TmpIndex
WHERE
index_name like @index_name /* If matching name */
or index_name is null /* If SQL_TABLE_STAT row */
ORDER BY non_unique, type, index_name, seq_in_index
else /* If only unique indexes desired */
SELECT
table_qualifier,
table_owner,
table_name,
non_unique,
index_qualifier,
index_name,
type,
seq_in_index,
column_name,
collation,
cardinality,
pages,
filter_condition = convert(varchar(128),null)
FROM #TmpIndex
WHERE
(non_unique = 0 /* If unique */
or non_unique is NULL) /* If SQL_TABLE_STAT row */
and (index_name like @index_name /* If matching name */
or index_name is null) /* If SQL_TABLE_STAT row */
ORDER BY non_unique, type, index_name, seq_in_index
DROP TABLE #TmpIndex
go
grant execute on sp_statistics to public
go
dump tran master with no_log
go
print 'creating sp_columns'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_columns (
@table_name varchar(90),
@table_owner varchar(90) = null,
@table_qualifier varchar(90) = null,
@column_name varchar(90) = null )
AS
DECLARE @full_table_name char(181)
DECLARE @table_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((charindex('%',@full_table_name) = 0) and
(charindex('_',@full_table_name) = 0) and
@table_id != 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = d.data_precision +convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60),
length = d.length +convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = d.numeric_scale +convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('<<<<<<<<<<<<<<?',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60),
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d
WHERE
o.id = @table_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND c.name like @column_name
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.usertype < 100 /* No user defined types */
UNION ALL
SELECT /* All other types including user data types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(d.data_precision, convert(int,c.length))
+isnull(d.aux, convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = d.numeric_scale +convert(smallint,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('<<<<<<<<<<<<<<?',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60)),
radix = d.numeric_radix,
nullable = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @table_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND c.usertype *= t.usertype
AND c.name like @column_name
AND (d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
OR c.usertype >= 100) /* User defined types */
ORDER BY colid
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = d.data_precision +convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60),
length = d.length +convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = d.numeric_scale,
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND c.name like @column_name
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.usertype < 100 /* No User defined types */
UNION ALL
SELECT /* All other types including user data types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(d.data_precision, convert(int,c.length))
+isnull(d.aux, convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = d.numeric_scale +convert(smallint,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('<<<<<<<<<<<<<<?',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60)),
radix = d.numeric_radix,
nullable = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @table_name
AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND c.usertype *= t.usertype
AND c.name like @column_name
AND (d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
OR c.usertype >= 100) /* User defined types */
ORDER BY table_owner, table_name, colid
end
go
if (charindex('6.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
end
else
drop proc sp_columns
go
/* Procedure for 6.0 server */
CREATE PROCEDURE sp_columns (
@table_name varchar(90),
@table_owner varchar(90) = null,
@table_qualifier varchar(90) = null,
@column_name varchar(90) = null )
AS
DECLARE @full_table_name char(181)
DECLARE @table_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1,'Table')
return
end
end
if @table_name is null
begin /* If table name not supplied, match all */
select @table_name = '%'
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if ((charindex('%',@full_table_name) = 0) and
(charindex('_',@full_table_name) = 0) and
@table_id != 0)
begin
/* this block is for the case where there is no pattern
matching required for the table name */
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = convert(int,c.prec),
length = d.length + convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848' */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d
WHERE
o.id = @table_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND c.name like @column_name
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.usertype < 100 /* No user defined types */
UNION ALL
SELECT /* Identity base and decimal/numeric types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = d.type_name,
"precision" = convert(int,c.prec),
length = convert(int,c.length) +
(convert(int,(c.type & 2)/2) |
(convert(int,c.type&64)/64))*(c.prec+2 - c.length),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @table_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND d.auto_increment = (c.status&128)/128
AND c.usertype = t.usertype
AND c.name like @column_name
AND ((c.status&128 = 128 /* Identity types only */
AND c.usertype < 100) /* No user defined types */
OR d.ss_dtype IN (106, 108, 55, 63)) /* decimal/numeric types */
UNION ALL
SELECT /* All other types including user data types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(convert(int,c.prec), 2147483647),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @table_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND isnull(d.auto_increment,0) = 0
AND (c.status&128 = 0 /* No Identity types unless */
OR c.usertype >= 100) /* User defined type */
AND c.usertype *= t.usertype
AND c.name like @column_name
AND (d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
OR c.usertype >= 100) /* User defined types */
AND d.ss_dtype NOT IN (106, 108, 55, 63) /* No decimal/numeric types */
ORDER BY colid
end
else
begin
/* this block is for the case where there IS pattern
matching done on the table name */
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = convert(int,c.prec),
length = d.length + convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d
WHERE
o.name like @table_name AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND c.name like @column_name
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.usertype < 100 /* No User defined types */
UNION ALL
SELECT /* Identity base and decimal/numeric types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = d.type_name,
"precision" = convert(int,c.prec),
length = convert(int,c.length) +
(convert(int,(c.type & 2)/2) |
(convert(int,c.type&64)/64))*(c.prec+2 - c.length),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @table_name AND user_name(o.uid) like @table_owner
AND c.id = o.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND d.auto_increment = (c.status&128)/128
AND c.usertype = t.usertype
AND c.name like @column_name
AND ((c.status&128 = 128 /* Identity types only */
AND c.usertype < 100) /* No user defined types */
OR d.ss_dtype IN (106, 108, 55, 63)) /* decimal/numeric types */
UNION ALL
SELECT /* All other types including user data types */
table_qualifier = DB_NAME(),
table_owner = USER_NAME(o.uid),
table_name = o.name,
column_name = c.name,
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(convert(int,c.prec), 2147483647),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = /* set nullability from status flag */
convert(smallint, convert(bit, c.status&8)),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @table_name AND user_name(o.uid) like @table_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND o.type != 'P'
AND isnull(d.auto_increment,0) = 0
AND (c.status&128 = 0 /* No Identity types unless */
OR c.usertype >= 100) /* User defined type */
AND c.usertype *= t.usertype
AND c.name like @column_name
AND (d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
OR c.usertype >= 100) /* User defined types */
AND d.ss_dtype NOT IN (106, 108, 55, 63) /* No decimal/numeric types */
ORDER BY table_owner, table_name, colid
end
go
grant execute on sp_columns to public
go
dump tran master with no_log
go
print 'creating sp_fkeys'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_fkeys(
@pktable_name varchar(32) = null,
@pktable_owner varchar(32) = null,
@pktable_qualifier varchar(32) = null,
@fktable_name varchar(32) = null,
@fktable_owner varchar(32) = null,
@fktable_qualifier varchar(32) = null )
as
declare @order_by_pk int
select @order_by_pk = 0
if (@pktable_name is null) and (@fktable_name is null)
begin /* If neither primary key nor foreign key table names given */
raiserror 20004 'PK table name or FK table name must be given.'
return
end
if @fktable_qualifier is not null
begin
if db_name() != @fktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Foreign Key Table qualifier must be name of current database'
return
end
end
if @pktable_qualifier is not null
begin
if db_name() != @pktable_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Primary Key Table qualifier must be name of current database'
return
end
end
if @pktable_name is null
begin /* If table name not supplied, match all */
select @pktable_name = '%'
select @order_by_pk = 1
end
if @pktable_owner is null /* If PK owner not supplied, match all */
select @pktable_owner = '%'
if @fktable_name is null /* If table name not supplied, match all */
select @fktable_name = '%'
if @fktable_owner is null /* If FK owner not supplied, match all */
select @fktable_owner = '%'
if @@trancount != 0
begin /* If inside a transaction */
raiserror 20003 'The procedure ''sp_fkeys'' cannot be executed from within a transaction.'
return
end
create table #fkeys(
pktable_qualifier varchar(32) NULL,
pktable_owner varchar(32) NULL,
pktable_name varchar(32) NOT NULL,
pkcolumn_name varchar(32) NOT NULL,
fktable_qualifier varchar(32) NULL,
fktable_owner varchar(32) NULL,
fktable_name varchar(32) NOT NULL,
fkcolumn_name varchar(32) NOT NULL,
key_seq smallint NOT NULL)
/* SQL Server supports upto 8 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* The inserts below adds a row to the temp table for each of the
8 possible relationships */
insert into #fkeys
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
1
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key1
and c2.id = k.depid
and c2.colid = k.depkey1
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
2
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key2
and c2.id = k.depid
and c2.colid = k.depkey2
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
3
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key3
and c2.id = k.depid
and c2.colid = k.depkey3
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
4
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key4
and c2.id = k.depid
and c2.colid = k.depkey4
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
5
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key5
and c2.id = k.depid
and c2.colid = k.depkey5
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
6
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key6
and c2.id = k.depid
and c2.colid = k.depkey6
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
7
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key7
and c2.id = k.depid
and c2.colid = k.depkey7
and o1.id = k.depid
and o2.id = k.id
union
select
db_name(),
user_name(o1.uid),
object_name(k.depid),
c2.name,
db_name(),
user_name(o2.uid),
object_name(k.id),
c1.name,
8
from
syskeys k, syscolumns c1, syscolumns c2,sysobjects o1, sysobjects o2
where
c1.id = k.id
and k.type = 2 /* Foreign type key */
and c1.colid = k.key8
and c2.id = k.depid
and c2.colid = k.depkey8
and o1.id = k.depid
and o2.id = k.id
if @order_by_pk = 1 /* If order by PK fields */
select
pktable_qualifier,
pktable_owner,
pktable_name,
pkcolumn_name,
fktable_qualifier,
fktable_owner,
fktable_name,
fkcolumn_name,
key_seq,
update_rule = convert(smallint, null),
delete_rule = convert(smallint,null),
fk_name = convert(varchar(32),null),
pk_name = convert(varchar(32),null)
from #fkeys
where fktable_name like @fktable_name
and fktable_owner like @fktable_owner
and pktable_name like @pktable_name
and pktable_owner like @pktable_owner
order by pktable_qualifier, pktable_owner, pktable_name, key_seq
else /* Order by FK fields */
select
pktable_qualifier,
pktable_owner,
pktable_name,
pkcolumn_name,
fktable_qualifier,
fktable_owner,
fktable_name,
fkcolumn_name,
key_seq,
update_rule = convert(smallint,null),
delete_rule = convert(smallint,null),
fk_name = convert(varchar(32),null),
pk_name = convert(varchar(32),null)
from #fkeys
where fktable_name like @fktable_name
and fktable_owner like @fktable_owner
and pktable_name like @pktable_name
and pktable_owner like @pktable_owner
order by fktable_qualifier, fktable_owner, fktable_name, key_seq
go
if (charindex('6.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_fkeys
go
/* Procedure for 6.0 server */
CREATE PROCEDURE sp_fkeys(
@pktable_name varchar(32) = null,
@pktable_owner varchar(32) = null,
@pktable_qualifier varchar(32) = null,
@fktable_name varchar(32) = null,
@fktable_owner varchar(32) = null,
@fktable_qualifier varchar(32) = null )
as
DECLARE @pktable_id int
DECLARE @pkfull_table_name char(70)
DECLARE @fktable_id int
DECLARE @fkfull_table_name char(70)
declare @order_by_pk int
select @order_by_pk = 0
if (@pktable_name is null) and (@fktable_name is null)
begin /* If neither primary key nor foreign key table names given */
raiserror (15252,-1,-1)
return
end
if @pktable_owner is null
begin /* If unqualified primary key table name */
SELECT @pkfull_table_name = @pktable_name
end
else
begin /* Qualified primary key table name */
SELECT @pkfull_table_name = @pktable_owner + '.' + @pktable_name
end
/* Get Object ID */
SELECT @pktable_id = object_id(@pkfull_table_name)
if @fktable_owner is null
begin /* If unqualified foreign key table name */
SELECT @fkfull_table_name = @fktable_name
end
else
begin /* Qualified foreign key table name */
SELECT @fkfull_table_name = @fktable_owner + '.' + @fktable_name
end
/* Get Object ID */
SELECT @fktable_id = object_id(@fkfull_table_name)
if @fktable_name is not null
begin
if @fktable_id is null
SELECT @fktable_id = 0 /* fk table not found, empty result */
end
if @pktable_name is null
begin /* If table name not supplied, match all */
select @order_by_pk = 1
end
else
begin
if @pktable_id is null
begin
SELECT @pktable_id = 0 /* pk table not found, empty result */
end
end
if @@trancount != 0
begin /* If inside a transaction */
raiserror(15002,-1,-1,'sp_fkeys')
return
end
create table #fkeys(
pkdb_id int NOT NULL,
pktable_id int NOT NULL,
pkcolid int NOT NULL,
fkdb_id int NOT NULL,
fktable_id int NOT NULL,
fkcolid int NOT NULL,
key_seq smallint NOT NULL,
fk_name varchar(32) NULL,
pk_name varchar(32) NULL)
/* SQL Server supports upto 16 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* The inserts below adds a row to the temp table for each of the
16 possible relationships */
insert into #fkeys
select
r.rkeydbid,
r.rkeyid,
r.rkey1,
r.fkeydbid,
r.fkeyid,
r.fkey1,
1,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey2,
r.fkeydbid,
r.fkeyid,
r.fkey2,
2,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey3,
r.fkeydbid,
r.fkeyid,
r.fkey3,
3,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey4,
r.fkeydbid,
r.fkeyid,
r.fkey4,
4,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey5,
r.fkeydbid,
r.fkeyid,
r.fkey5,
5,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey6,
r.fkeydbid,
r.fkeyid,
r.fkey6,
6,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey7,
r.fkeydbid,
r.fkeyid,
r.fkey7,
7,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey8,
r.fkeydbid,
r.fkeyid,
r.fkey8,
8,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey9,
r.fkeydbid,
r.fkeyid,
r.fkey9,
9,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey10,
r.fkeydbid,
r.fkeyid,
r.fkey10,
10,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey11,
r.fkeydbid,
r.fkeyid,
r.fkey11,
11,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey12,
r.fkeydbid,
r.fkeyid,
r.fkey12,
12,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey13,
r.fkeydbid,
r.fkeyid,
r.fkey13,
13,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey14,
r.fkeydbid,
r.fkeyid,
r.fkey14,
14,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey15,
r.fkeydbid,
r.fkeyid,
r.fkey15,
15,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
union
select
r.rkeydbid,
r.rkeyid,
r.rkey16,
r.fkeydbid,
r.fkeyid,
r.fkey16,
16,
OBJECT_NAME(r.constid),
i.name
from
sysreferences r, sysindexes i
where r.rkeyid = i.id
AND (i.status & 0x800) = 0x800
AND r.rkeyid between isnull(@pktable_id, 0) and isnull(@pktable_id, 0x7fffffff)
AND r.fkeyid between isnull(@fktable_id, 0) and isnull(@fktable_id, 0x7fffffff)
if @order_by_pk = 1 /* If order by PK fields */
select
pktable_qualifier = DB_NAME(f.pkdb_id),
pktable_owner = USER_NAME(o1.uid),
pktable_name = o1.name,
pkcolumn_name = c1.name,
fktable_qualifier = DB_NAME(f.fkdb_id),
fktable_owner = USER_NAME(o2.uid),
fktable_name = o2.name,
fkcolumn_name = c2.name,
key_seq,
update_rule = convert(smallint,1),
delete_rule = convert(smallint,1),
fk_name,
pk_name
from #fkeys f,
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2
where o1.id = f.pktable_id
AND o2.id = f.fktable_id
AND c1.id = f.pktable_id
AND c2.id = f.fktable_id
AND c1.colid = f.pkcolid
AND c2.colid = f.fkcolid
order by pktable_qualifier, pktable_owner, pktable_name, key_seq
else /* Order by FK fields */
select
pktable_qualifier = DB_NAME(f.pkdb_id),
pktable_owner = USER_NAME(o1.uid),
pktable_name = o1.name,
pkcolumn_name = c1.name,
fktable_qualifier = DB_NAME(f.fkdb_id),
fktable_owner = USER_NAME(o2.uid),
fktable_name = o2.name,
fkcolumn_name = c2.name,
key_seq,
update_rule = convert(smallint,1),
delete_rule = convert(smallint,1),
fk_name,
pk_name
from #fkeys f,
sysobjects o1, sysobjects o2,
syscolumns c1, syscolumns c2
where o1.id = f.pktable_id
AND o2.id = f.fktable_id
AND c1.id = f.pktable_id
AND c2.id = f.fktable_id
AND c1.colid = f.pkcolid
AND c2.colid = f.fkcolid
order by fktable_qualifier, fktable_owner, fktable_name, key_seq
go
grant execute on sp_fkeys to public
go
dump tran master with no_log
go
print 'creating sp_pkeys'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_pkeys(
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null )
as
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @table_owner is null /* If owner not supplied, match all */
select @table_owner = '%'
if @@trancount != 0
begin /* If inside a transaction */
raiserror 20003 'The procedure ''sp_pkeys'' cannot be executed from within a transaction.'
return
end
create table #pkeys(
table_qualifier varchar(32) NULL,
table_owner varchar(32) NULL,
table_name varchar(32) NOT NULL,
column_name varchar(32) NOT NULL,
key_seq smallint NOT NULL)
/* SQL Server supports upto 8 PK/FK relationships between 2 tables */
/* Process syskeys for each relationship */
/* The inserts below adds a row to the temp table for each of the
8 possible relationships */
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
1
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = k.key1
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
2
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key2
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
3
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key3
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
4
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key4
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
5
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key5
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
6
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key6
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
7
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key7
if (@@rowcount = 0)
goto done
insert into #pkeys
select
db_name(),
(select user_name(uid) from sysobjects o where o.id = k.id),
object_name(k.id),
c.name,
8
from
syskeys k, syscolumns c
where
c.id = k.id
and k.type = 1 /* Primary type key */
and c.colid = key8
done:
select
table_qualifier,
table_owner,
table_name,
column_name,
key_seq,
pk_name = convert(varchar(32),null)
from #pkeys
where table_name = @table_name
and table_owner like @table_owner
order by table_qualifier, table_owner, table_name, key_seq
go
if (charindex('6.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
end
else
drop proc sp_pkeys
go
/* Procedure for 6.0 server */
CREATE PROCEDURE sp_pkeys(
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null )
as
DECLARE @table_id int
DECLARE @full_table_name char(70)
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1,'Table')
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
select
table_qualifier = db_name(),
table_owner = user_name(o.uid),
table_name = o.name,
column_name = c.name,
key_seq = convert(smallint,c1.colid),
pk_name = i.name
from
sysindexes i, syscolumns c, sysobjects o, syscolumns c1
where
o.id = @table_id
and o.id = c.id
and o.id = i.id
and (i.status & 0x800) = 0x800
and c.name = index_col (@full_table_name, i.indid, c1.colid)
and c1.colid <= i.keycnt /* create rows from 1 to keycnt */
and c1.id = @table_id
order by table_qualifier, table_owner, table_name, key_seq
go
grant execute on sp_pkeys to public
go
dump tran master with no_log
go
print 'creating sp_stored_procedures'
go
create procedure sp_stored_procedures(
@sp_name varchar(96) = null,
@sp_owner varchar(90) = null,
@sp_qualifier varchar(32) = null)
as
declare @proc_type smallint
if @sp_qualifier is not null
begin
if db_name() != @sp_qualifier
begin
if @sp_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @sp_name = ''
select @sp_owner = ''
end else
begin /* If qualifier doesn't match current database */
raiserror 20001 'Procedure qualifier must be name of current database'
return
end
end
end
if @sp_name is null
begin /* If procedure name not supplied, match all */
select @sp_name = '%'
end
else begin
if (@sp_owner is null) and (charindex('%', @sp_name) = 0)
begin
if exists (select * from sysobjects
where uid = user_id()
and name = @sp_name
and type = 'P') /* Object type of Procedure */
begin
select @sp_owner = user_name()
end
end
end
if @sp_owner is null /* If procedure owner not supplied, match all */
select @sp_owner = '%'
select @proc_type=2 /* Return 2 for 4.2 and later servers. */
select
procedure_qualifier = db_name(),
procedure_owner = user_name(o.uid),
procedure_name = o.name +';'+ ltrim(str(p.number,5)),
num_input_params = -1, /* Constant since value unknown */
num_output_params = -1, /* Constant since value unknown */
num_result_sets = -1, /* Constant since value unknown */
remarks = convert(varchar(254),null), /* Remarks are NULL */
procedure_type = @proc_type
from
sysobjects o,sysprocedures p,sysusers u
where
o.name like @sp_name
and p.sequence = 0
and user_name(o.uid) like @sp_owner
and o.type = 'P' /* Object type of Procedure */
and p.id = o.id
and u.uid = user_id() /* constrain sysusers uid for use in subquery */
and (suser_id() = 1 /* User is the System Administrator */
or o.uid = user_id() /* User created the object */
/* here's the magic... select the highest precedence of permissions in the order (user,group,public) */
or ((select max(((sign(uid)*abs(uid-16383))*2)+(protecttype&1))
from sysprotects p
/* outer join to correlate with all rows in sysobjects */
where p.id =* o.id
/* get rows for public,current user,user's group */
and (p.uid = 0 or p.uid = user_id() or p.uid =* u.gid)
/* check for SELECT,EXECUTE privilege */
and (action in (193,224)))&1 /* more magic...normalize GRANT */
) = 1 /* final magic...compare Grants */
)
order by procedure_qualifier, procedure_owner, procedure_name
go
grant execute on sp_stored_procedures to public
go
dump tran master with no_log
go
print 'creating sp_sproc_columns'
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_sproc_columns (
@procedure_name varchar(96) = '%',
@procedure_owner varchar(90) = null,
@procedure_qualifier varchar(32) = null,
@column_name varchar(90) = null )
AS
DECLARE @group_num int
DECLARE @semi_position int
DECLARE @full_procedure_name char(187)
DECLARE @procedure_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @procedure_qualifier is not null
begin
if db_name() != @procedure_qualifier
begin
if @procedure_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @procedure_name = ''
select @procedure_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror 20001 'Procedure qualifier must be name of current database'
return
end
end
end
if @procedure_name is null
begin /* If procedure name not supplied, match all */
select @procedure_name = '%'
end
/* first we need to extract the procedure group number, if one exists */
select @semi_position = charindex(';',@procedure_name)
if (@semi_position > 0)
begin /* If group number separator (;) found */
select @group_num = convert(int,substring(@procedure_name, @semi_position + 1, 2))
select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
end
else
begin /* No group separator, so default to group number of 1 */
select @group_num = 1
end
if @procedure_owner is null
begin /* If unqualified procedure name */
SELECT @full_procedure_name = @procedure_name
end
else
begin /* Qualified procedure name */
SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
end
/* Get Object ID */
SELECT @procedure_id = object_id(@full_procedure_name)
if ((charindex('%',@full_procedure_name) = 0) and
(charindex('_',@full_procedure_name) = 0) and
@procedure_id != 0)
begin
/* this block is for the case where there is no pattern
matching required for the procedure name */
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 0),
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = d.data_precision,
length = d.length +convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = d.numeric_scale,
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
sysprocedures p
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.usertype = t.usertype
AND c.type = d.ss_dtype
AND c.name like @column_name
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.number = @group_num
UNION
SELECT /* All other types including user data types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 0),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(d.data_precision, convert(int,c.length))
+isnull(d.aux, convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = d.numeric_scale +convert(smallint,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('<<<<<<<<<<<<<<?',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60)),
radix = d.numeric_radix,
d.nullable,
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND c.usertype *= t.usertype
AND c.name like @column_name
AND d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
AND c.number = @group_num
UNION ALL
SELECT /* return value row*/
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ isnull(ltrim(str(c.number,5)),'1'),
column_name = convert(varchar(32),'RETURN_VALUE'),
column_type = convert(smallint, 5),
data_type = convert(smallint, 4),
type_name = convert(varchar(32),'int'),
"precision" = convert(int,10),
length = convert(int,4),
scale = convert(smallint,0),
radix = convert(smallint,10),
nullable = convert(smallint,0),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = convert(tinyint,56),
colid = convert(tinyint,0)
FROM
syscolumns c,
sysobjects o
WHERE
o.id = @procedure_id
AND c.id =* o.id
AND c.colid = 1
AND 'RETURN_VALUE' like @column_name
ORDER BY procedure_qualifier, procedure_owner, procedure_name, colid
end
else
begin
/* this block is for the case where there IS pattern
matching done on the procedure name */
if @procedure_owner is null
select @procedure_owner = '%'
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 0),
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = isnull(d.data_precision, convert(int,c.length))
+isnull(d.aux, convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
length = d.length +convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = d.numeric_scale,
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.usertype = t.usertype
AND c.type = d.ss_dtype
AND c.name like @column_name
AND o.type = 'P' /* Just Procedures */
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
UNION
SELECT /* All other types including user data types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 0),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(d.data_precision, convert(int,c.length))
+isnull(d.aux, convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = d.numeric_scale +convert(smallint,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('<<<<<<<<<<<<<<?',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60)),
radix = d.numeric_radix,
d.nullable,
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND c.usertype *= t.usertype
AND o.type = 'P' /* Just Procedures */
AND c.name like @column_name
AND d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
UNION ALL
SELECT /* return value row*/
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ isnull(ltrim(str(c.number,5)),'1'),
column_name = convert(varchar(32),'RETURN_VALUE'),
column_type = convert(smallint, 5),
data_type = convert(smallint, 4),
type_name = convert(varchar(32),'int'),
"precision" = convert(int,10),
length = convert(int,4),
scale = convert(smallint,0),
radix = convert(smallint,10),
nullable = convert(smallint,0),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = convert(tinyint,56),
colid = convert(tinyint,0)
FROM
syscolumns c,
sysobjects o
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND c.id =* o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND 'RETURN_VALUE' like @column_name
ORDER BY procedure_qualifier, procedure_owner, procedure_name, colid
end
go
if (charindex('6.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following error.'
end
else
drop proc sp_sproc_columns
go
/* Procedure for 6.0 server */
CREATE PROCEDURE sp_sproc_columns (
@procedure_name varchar(96) = '%',
@procedure_owner varchar(90) = null,
@procedure_qualifier varchar(32) = null,
@column_name varchar(90) = null )
AS
DECLARE @group_num int
DECLARE @semi_position int
DECLARE @full_procedure_name char(187)
DECLARE @procedure_id int
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @procedure_qualifier is not null
begin
if db_name() != @procedure_qualifier
begin
if @procedure_qualifier = ''
begin
/* in this case, we need to return an empty result set */
/* because the user has requested a database with an empty name */
select @procedure_name = ''
select @procedure_owner = ''
end
else
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1,'Procedure')
return
end
end
end
if @procedure_name is null
begin /* If procedure name not supplied, match all */
select @procedure_name = '%'
end
/* first we need to extract the procedure group number, if one exists */
select @semi_position = charindex(';',@procedure_name)
if (@semi_position > 0)
begin /* If group number separator (;) found */
select @group_num = convert(int,substring(@procedure_name, @semi_position + 1, 2))
select @procedure_name = substring(@procedure_name, 1, @semi_position -1)
end
else
begin /* No group separator, so default to group number of 1 */
select @group_num = 1
end
if @procedure_owner is null
begin /* If unqualified procedure name */
SELECT @full_procedure_name = @procedure_name
end
else
begin /* Qualified procedure name */
SELECT @full_procedure_name = @procedure_owner + '.' + @procedure_name
end
/* Get Object ID */
SELECT @procedure_id = object_id(@full_procedure_name)
if ((charindex('%',@full_procedure_name) = 0) and
(charindex('_',@full_procedure_name) = 0) and
@procedure_id != 0)
begin
/* this block is for the case where there is no pattern
matching required for the procedure name */
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 1+((c.status/64)&1)),
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = convert(int,c.prec),
length = d.length + convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t,
sysprocedures p
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.usertype = t.usertype
AND c.type = d.ss_dtype
AND isnull(d.auto_increment,0) = 0
AND c.name like @column_name
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.number = @group_num
UNION ALL
SELECT /* decimal/numeric types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 1+((c.status/64)&1)),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = convert(int,c.prec),
length = convert(int,c.prec) + 2,
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
d.nullable,
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND isnull(d.auto_increment,0) = 0
AND c.usertype *= t.usertype
AND c.name like @column_name
AND d.ss_dtype IN (106, 108, 55, 63) /* decimal/numeric types */
AND c.number = @group_num
UNION ALL
SELECT /* All other types including user data types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 1+((c.status/64)&1)),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(convert(int,c.prec), 2147483647),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
d.nullable,
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.id = @procedure_id
AND c.id = o.id
AND c.type = d.ss_dtype
AND isnull(d.auto_increment,0) = 0
AND c.usertype *= t.usertype
AND c.name like @column_name
AND d.ss_dtype NOT IN (111, 109, 38, 110, 106, 108, 55, 63) /* No *N types */
AND c.number = @group_num
UNION ALL
SELECT /* return value row*/
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ isnull(ltrim(str(c.number,5)),'1'),
column_name = convert(varchar(32),'RETURN_VALUE'),
column_type = convert(smallint, 5),
data_type = convert(smallint, 4),
type_name = convert(varchar(32),'int'),
"precision" = convert(int,10),
length = convert(int,4),
scale = convert(smallint,0),
radix = convert(smallint,10),
nullable = convert(smallint,0),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = convert(tinyint,56),
colid = convert(tinyint,0)
FROM
syscolumns c,
sysobjects o
WHERE
o.id = @procedure_id
AND c.id =* o.id
AND c.colid = 1
AND 'RETURN_VALUE' like @column_name
ORDER BY procedure_qualifier, procedure_owner, procedure_name, colid
end
else
begin
/* this block is for the case where there IS pattern
matching done on the procedure name */
if @procedure_owner is null
select @procedure_owner = '%'
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 1+((c.status/64)&1)),
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = convert(int,c.prec),
length = d.length + convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
nullable = convert(smallint, 1),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.usertype = t.usertype
AND isnull(d.auto_increment,0) = 0
AND c.type = d.ss_dtype
AND c.name like @column_name
AND o.type = 'P' /* Just Procedures */
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
UNION ALL
SELECT /* decimal/numeric types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 1+((c.status/64)&1)),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = convert(int,c.prec),
length = convert(int,c.prec) + 2,
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
d.nullable,
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND c.id = o.id
AND c.type = d.ss_dtype
AND isnull(d.auto_increment,0) = 0
AND c.usertype *= t.usertype
AND o.type = 'P' /* Just Procedures */
AND c.name like @column_name
AND d.ss_dtype IN (106, 108, 55, 63) /* decimal/numeric types */
UNION ALL
SELECT /* All other types including user data types */
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ ltrim(str(c.number,5)),
column_name = c.name,
column_type = convert(smallint, 1+((c.status/64)&1)),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(convert(int,c.prec), 2147483647),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = convert(smallint, c.scale),
radix = d.numeric_radix,
d.nullable,
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = c.type,
colid = c.colid
FROM
syscolumns c,
sysobjects o,
master.dbo.spt_datatype_info d,
systypes t
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND o.id = c.id
AND c.type = d.ss_dtype
AND isnull(d.auto_increment,0) = 0
AND c.usertype *= t.usertype
AND o.type = 'P' /* Just Procedures */
AND c.name like @column_name
AND d.ss_dtype NOT IN (111, 109, 38, 110, 106, 108, 55, 63) /* No *N types */
UNION ALL
SELECT /* return value row*/
procedure_qualifier = DB_NAME(),
procedure_owner = USER_NAME(o.uid),
procedure_name = o.name +';'+ isnull(ltrim(str(c.number,5)),'1'),
column_name = convert(varchar(32),'RETURN_VALUE'),
column_type = convert(smallint, 5),
data_type = convert(smallint, 4),
type_name = convert(varchar(32),'int'),
"precision" = convert(int,10),
length = convert(int,4),
scale = convert(smallint,0),
radix = convert(smallint,10),
nullable = convert(smallint,0),
remarks = convert(varchar(254),null), /* Remarks are NULL */
ss_data_type = convert(tinyint,56),
colid = convert(tinyint,0)
FROM
syscolumns c,
sysobjects o
WHERE
o.name like @procedure_name
AND user_name(o.uid) like @procedure_owner
AND c.id =* o.id
AND c.colid = 1
AND o.type = 'P' /* Just Procedures */
AND 'RETURN_VALUE' like @column_name
ORDER BY procedure_qualifier, procedure_owner, procedure_name, colid
end
go
grant execute on sp_sproc_columns to public
go
print 'creating sp_table_privileges'
go
CREATE PROCEDURE sp_table_privileges (
@table_name varchar(90),
@table_owner varchar(90) = null,
@table_qualifier varchar(32) = null)
as
declare @table_id int,
@owner_id int,
@full_table_name char(181)
declare @refconst int
select @refconst = 1
if (charindex('6.00', @@version) = 0)
select @refconst = NULL
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @@trancount != 0
begin /* If inside a transaction */
raiserror 20003 'The procedure ''sp_table_privileges'' cannot be executed from within a transaction.'
return
end
create table #table_priv1(
table_qualifier varchar(32) NOT NULL,
table_owner varchar(32) NOT NULL,
table_name varchar(32) NOT NULL,
grantor varchar(32) NOT NULL,
grantee varchar(32) NOT NULL,
select_privilege int NOT NULL,
insert_privilege int NOT NULL,
update_privilege int NOT NULL,
delete_privilege int NOT NULL,
references_privilege int NULL,
is_grantable varchar(3) NOT NULL,
uid int NOT NULL,
gid int NOT NULL)
insert into #table_priv1
select distinct
db_name(),
user_name(o.uid),
o.name,
user_name(o.uid),
u.name,
0,
0,
0,
0,
@refconst,
'no',
u.uid,
u.gid
from sysusers u, sysobjects o
where o.id = @table_id and u.uid != u.gid
and sysstat & 0xf in (1,2,3) /* only valid for system tables,
** user tables, and views. */
/*
** now add row for table owner
*/
if exists (
select *
from #table_priv1
where grantor = grantee)
begin
update #table_priv1
set
select_privilege = 1,
update_privilege = 1,
insert_privilege = 1,
delete_privilege = 1,
references_privilege = 1,
is_grantable = 'yes'
where grantor = grantee
end
else
begin
insert into #table_priv1
select db_name(),
user_name(o.uid),
o.name,
user_name(o.uid),
user_name(o.uid),
1,
1,
1,
1,
@refconst,
'yes',
o.uid,
u.gid
from sysobjects o, sysusers u
where o.id = @table_id and u.uid = o.uid
and sysstat & 0xf in (1,2,3) /* only valid for system tables,
** user tables, and views. */
end
update #table_priv1
set select_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 193)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 193)
update #table_priv1
set insert_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 195)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 195)
update #table_priv1
set delete_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 196)
and not exists (select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 196)
update #table_priv1
set update_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 197)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 197)
update #table_priv1
set references_privilege = 1
where
exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 205
and action = 26)
and not exists (
select * from sysprotects
where
id = @table_id
and (#table_priv1.uid = uid
or #table_priv1.gid = uid
or uid = 0)
and protecttype = 206
and action = 26)
create table #table_priv2(
table_qualifier varchar(32) NULL,
table_owner varchar(32) NULL,
table_name varchar(32) NOT NULL,
grantor varchar(32) NULL,
grantee varchar(32) NOT NULL,
privilege varchar(32) NOT NULL,
is_grantable varchar(3) NULL)
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'SELECT',
is_grantable
from #table_priv1
where select_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'INSERT',
is_grantable
from #table_priv1
where insert_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'DELETE',
is_grantable
from #table_priv1
where delete_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'UPDATE',
is_grantable
from #table_priv1
where update_privilege = 1
insert into #table_priv2
select
table_qualifier,
table_owner,
table_name,
grantor,
grantee,
'REFERENCES',
is_grantable
from #table_priv1
where references_privilege = 1
select * from #table_priv2
order by privilege
go
grant execute on sp_table_privileges to public
go
dump tran master with no_log
go
print 'creating sp_column_privileges'
go
CREATE PROCEDURE sp_column_privileges (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@column_name varchar(90) = null)
as
declare @table_id int,
@owner_id int
DECLARE @full_table_name char(70)
declare @low int /* range of userids to check */
declare @high int
declare @objid int /* id of @name if object */
declare @owner_name char(32)
declare @refconst int
select @low = 0, @high = 32767
select @refconst = 1
if (charindex('6.00', @@version) = 0)
select @refconst = NULL
if @column_name is null /* If column name not supplied, match all */
select @column_name = '%'
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
select @table_id = object_id(@full_table_name)
if @@trancount != 0
begin /* If inside a transaction */
raiserror 20003 'The procedure ''sp_column_privileges'' cannot be executed from within a transaction.'
return
end
/*
** We need to create a table which will contain a row for every row to
** be returned to the client.
*/
create table #column_priv1(
table_qualifier varchar(32) NOT NULL,
table_owner varchar(32) NOT NULL,
table_name varchar(32) NOT NULL,
column_name varchar(32) NOT NULL,
grantor varchar(32) NOT NULL,
grantee varchar(32) NOT NULL,
select_privilege int NOT NULL,
select_grantable int NOT NULL,
insert_privilege int NOT NULL,
insert_grantable int NOT NULL,
update_privilege int NOT NULL,
update_grantable int NOT NULL,
references_privilege int null,
references_grantable int null,
uid int NOT NULL,
gid int NOT NULL,
is_grantable varchar(3) NOT NULL)
/*
** insert a row for the table owner (who has all permissions)
*/
select @owner_name = (
select user_name(uid)
from sysobjects
where id = @table_id)
insert into #column_priv1
select
db_name(),
@owner_name,
@table_name,
name,
@owner_name,
@owner_name,
1,
1,
1,
1,
1,
1,
@refconst,
@refconst,
user_id(@owner_name),
0,
'yes'
from syscolumns
where id = @table_id
/*
** now stick a row in the table for every user in the database
** we will need to weed out those who have no permissions later
** (and yes this is a cartesion product: the uid field in sysprotects
** can also have a group id, in which case we need to extend those
** privileges to all group members).
*/
insert into #column_priv1
select distinct
db_name(),
user_name(o.uid),
@table_name,
c.name,
user_name(o.uid),
u.name,
0,
0,
0,
0,
0,
0,
0,
0,
u.uid,
u.gid,
'no'
from sysusers u, syscolumns c, sysobjects o
where o.id = @table_id
and c.id = o.id
and u.gid != u.uid
and u.name != @owner_name
/*
** we need to create another temporary table to contain all the various
** protection information for the table in question
*/
create table #protects (
uid smallint NOT NULL,
action tinyint NOT NULL,
protecttype tinyint NOT NULL,
name varchar(32) NOT NULL)
insert into #protects
select
p.uid,
p.action,
p.protecttype,
isnull(col_name(id, c.number), 'All')
from
sysprotects p,
master.dbo.spt_values c,
master.dbo.spt_values a,
master.dbo.spt_values b
where
convert(tinyint, substring(isnull(p.columns, 0x1), c.low, 1))
& c.high != 0
and c.number <= (
select count(*)
from syscolumns
where id = @table_id)
and a.type = 'T'
and a.number = p.action
and p.action in (193,195,197,26)
and b.type = 'T'
and b.number = p.protecttype
and p.id = @table_id
and p.uid between @low and @high
update #column_priv1
set select_privilege = 1
where
exists (
select * from #protects
where
protecttype = 205
and action = 193
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
and not exists (
select * from #protects
where
protecttype = 206
and action = 193
and (name = #column_priv1.column_name
or name = 'All')
and ( uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set insert_privilege = 1
where
exists (
select * from #protects
where
protecttype = 205
and action = 195
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
and not exists (
select * from #protects
where
protecttype = 206
and action = 195
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set update_privilege = 1
where
exists (
select * from #protects
where protecttype = 205
and action = 197
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
and not exists (
select * from #protects
where protecttype = 206
and action = 197
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
update #column_priv1
set references_privilege = 1
where
exists (
select * from #protects
where protecttype = 205
and action = 26
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
and not exists (
select * from #protects
where protecttype = 206
and action = 26
and (name = #column_priv1.column_name
or name = 'All')
and (uid = 0
or uid = #column_priv1.gid
or uid = #column_priv1.uid))
create table #column_priv2(
table_qualifier varchar(32) NULL,
table_owner varchar(32) NULL,
table_name varchar(32) NOT NULL,
column_name varchar(32) NOT NULL,
grantor varchar(32) NULL,
grantee varchar(32) NOT NULL,
privilege varchar(32) NOT NULL,
is_grantable varchar(3) NULL)
insert into #column_priv2
select
table_qualifier,
table_owner,
table_name,
column_name,
grantor,
grantee,
'SELECT',
is_grantable
from #column_priv1
where select_privilege = 1
insert into #column_priv2
select
table_qualifier,
table_owner,
table_name,
column_name,
grantor,
grantee,
'INSERT',
is_grantable
from #column_priv1
where insert_privilege = 1
insert into #column_priv2
select
table_qualifier,
table_owner,
table_name,
column_name,
grantor,
grantee,
'UPDATE',
is_grantable
from #column_priv1
where update_privilege = 1
insert into #column_priv2
select
table_qualifier,
table_owner,
table_name,
column_name,
grantor,
grantee,
'REFERENCES',
is_grantable
from #column_priv1
where references_privilege = 1
select * from #column_priv2
where column_name like @column_name
order by column_name, privilege
go
grant execute on sp_column_privileges to public
go
dump tran master with no_log
go
print 'creating sp_server_info'
go
create proc sp_server_info (
@attribute_id int = null)
as
if @attribute_id is not null
select *
from master.dbo.spt_server_info
where attribute_id = @attribute_id
else
select *
from master.dbo.spt_server_info
order by attribute_id
go
grant execute on sp_server_info to public
go
print 'creating sp_datatype_info'
go
/* the messiness of 'data_type' was to get around the problem of
returning the correct lengths for user defined types. the join
on the type name ensures all user defined types are returned, but
this puts a null in the data_type column. by forcing an embedded
select and correlating it with the current row in systypes, we get
the correct data_type mapping even for user defined types (kwg) */
/* Procedure for pre-6.0 server */
create proc sp_datatype_info
(@data_type int = 0)
as
if @data_type = 0
select /* Real SQL Server data types */
type_name = t.name,
d.data_type,
"precision" = isnull(d.data_precision, convert(int,t.length)),
d.literal_prefix,
d.literal_suffix,
e.create_params,
d.nullable,
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
d.local_type_name,
minimum_scale = d.numeric_scale,
maximum_scale = d.numeric_scale,
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.ss_dtype = t.type
and t.usertype *= e.user_type
and t.usertype not in (80,18) /* No SYSNAME or TIMESTAMP */
and t.usertype < 100 /* No user defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
UNION ALL
select /* SQL Server SYSNAME, TIMESTAMP and user data types */
type_name = t.name,
d.data_type,
"precision" = isnull(d.data_precision, convert(int,t.length)),
d.literal_prefix,
d.literal_suffix,
e.create_params,
d.nullable,
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
t.name,
minimum_scale = d.numeric_scale,
maximum_scale = d.numeric_scale,
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.ss_dtype = t.type
and t.usertype *= e.user_type
and (t.usertype in (80,18) /* SYSNAME or TIMESTAMP */
or t.usertype >= 100) /* User defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
order by d.data_type, d.auto_increment, d.money, t.usertype
else
select /* Real SQL Server data types */
type_name = t.name,
d.data_type,
"precision" = isnull(d.data_precision, convert(int,t.length)),
d.literal_prefix,
d.literal_suffix,
e.create_params,
d.nullable,
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
d.local_type_name,
minimum_scale = d.numeric_scale,
maximum_scale = d.numeric_scale,
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
data_type = @data_type
and d.ss_dtype = t.type
and t.usertype *= e.user_type
and t.usertype not in (80,18) /* No SYSNAME or TIMESTAMP */
and t.usertype < 100 /* No user defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
UNION ALL
select /* SQL Server SYSNAME, TIMESTAMP and user data types */
type_name = t.name,
d.data_type,
"precision" = isnull(d.data_precision, convert(int,t.length)),
d.literal_prefix,
d.literal_suffix,
e.create_params,
d.nullable,
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
t.name,
minimum_scale = d.numeric_scale,
maximum_scale = d.numeric_scale,
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
data_type = @data_type
and d.ss_dtype = t.type
and t.usertype *= e.user_type
and (t.usertype in (80,18) /* SYSNAME or TIMESTAMP */
or t.usertype >= 100) /* User defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
order by d.auto_increment, d.money, t.usertype
go
if (charindex('6.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_datatype_info
go
/* Procedure for 6.0 server */
create proc sp_datatype_info
(@data_type int = 0, @dummy int = 0)
as
if @data_type = 0
select /* Real SQL Server data types */
type_name = d.type_name,
d.data_type,
"precision" = isnull(convert(int,t.prec+d.numdec*(@@max_precision-convert(int,t.prec))), 2147483647),
d.literal_prefix,
d.literal_suffix,
e.create_params,
nullable = t.allownulls & (~(isnull(d.auto_increment,0))),
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
d.local_type_name,
minimum_scale = d.numeric_scale,
maximum_scale = convert(smallint,(t.scale+d.numdec*(@@max_precision-convert(int,t.scale)))*(isnull(d.auto_increment,0)^1)),
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.ss_dtype = t.type
and t.usertype *= e.user_type
and isnull(d.auto_increment,0) *= e.auto_increment
and t.usertype not in (80,18,24,10) /* No SYSNAME, TIMESTAMP, DECIMAL, NUMERIC*/
and t.usertype < 100 /* No user defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
UNION ALL
select /* SQL Server SYSNAME, TIMESTAMP and user data types */
type_name = t.name,
d.data_type,
"precision" = isnull(convert(int,t.prec+d.numdec*(@@max_precision-convert(int,t.prec))), 2147483647),
d.literal_prefix,
d.literal_suffix,
e.create_params,
nullable = t.allownulls & (~(isnull(d.auto_increment,0))),
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
t.name,
minimum_scale = d.numeric_scale,
maximum_scale = convert(smallint,(t.scale+d.numdec*(@@max_precision-convert(int,t.scale)))*(isnull(d.auto_increment,0)^1)),
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
d.ss_dtype = t.type
and isnull(d.auto_increment,0) = 0
and t.usertype *= e.user_type
and (t.usertype in (80,18) /* SYSNAME or TIMESTAMP */
or t.usertype >= 100) /* User defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
order by d.data_type, d.auto_increment, d.money, t.usertype
else
select /* Real SQL Server data types */
type_name = d.type_name,
d.data_type,
"precision" = isnull(convert(int,t.prec+d.numdec*(@@max_precision-convert(int,t.prec))), 2147483647),
d.literal_prefix,
d.literal_suffix,
e.create_params,
nullable = t.allownulls & (~(isnull(d.auto_increment,0))),
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
d.local_type_name,
minimum_scale = d.numeric_scale,
maximum_scale = convert(smallint,(t.scale+d.numdec*(@@max_precision-convert(int,t.scale)))*(isnull(d.auto_increment,0)^1)),
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
data_type = @data_type
and d.ss_dtype = t.type
and t.usertype *= e.user_type
and isnull(d.auto_increment,0) *= e.auto_increment
and t.usertype not in (80,18,24,10) /* No SYSNAME, TIMESTAMP, DECIMAL, NUMERIC*/
and t.usertype < 100 /* No user defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
UNION ALL
select /* SQL Server SYSNAME, TIMESTAMP and user data types */
type_name = t.name,
d.data_type,
"precision" = isnull(convert(int,t.prec+d.numdec*(@@max_precision-convert(int,t.prec))), 2147483647),
d.literal_prefix,
d.literal_suffix,
e.create_params,
nullable = t.allownulls & (~(isnull(d.auto_increment,0))),
d.case_sensitive,
d.searchable,
d.unsigned_attribute,
d.money,
d.auto_increment,
t.name,
minimum_scale = d.numeric_scale,
maximum_scale = convert(smallint,(t.scale+d.numdec*(@@max_precision-convert(int,t.scale)))*(isnull(d.auto_increment,0)^1)),
t.usertype
from master.dbo.spt_datatype_info d, master.dbo.spt_datatype_info_ext e, systypes t
where
data_type = @data_type
and d.ss_dtype = t.type
and isnull(d.auto_increment,0) = 0
and t.usertype *= e.user_type
and (t.usertype in (80,18) /* SYSNAME or TIMESTAMP */
or t.usertype >= 100) /* User defined types */
and t.type not in (111,109,38,110) /* get rid of nullable types */
order by d.auto_increment, d.money, t.usertype
go
grant execute on sp_datatype_info to public
go
dump tran master with no_log
go
print 'creating sp_special_columns'
go
dump tran master with no_log
go
/* Procedure for pre-6.0 server */
CREATE PROCEDURE sp_special_columns (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@col_type char(1) = 'R',
@scope char(1) = 'T',
@nullable char(1) = 'U')
AS
DECLARE @indid int
DECLARE @table_id int
DECLARE @full_table_name char(70)
DECLARE @msg char(70)
DECLARE @scopeout smallint
if @col_type not in ('R','V')
begin
raiserror 20002 'Illegal ''col_type'' specified -- must be ''R'' or ''V''.'
return
end
if @scope = 'C'
select @scopeout = 0
else if @scope = 'T'
select @scopeout = 1
else
begin
raiserror 20002 'Illegal ''scope'' specified -- must be ''C'' or ''T''.'
return
end
if @nullable not in ('U','O')
begin
raiserror 20002 'Illegal ''nullable'' specified -- must be ''U'' or ''O''.'
return
end
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror 20001 'Table qualifier must be name of current database'
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @col_type = 'V'
BEGIN /* if ROWVER, just run that query */
SELECT
scope = convert(smallint,NULL),
column_name = c.name,
data_type = convert(smallint, -3),
type_name = t.name,
"precision" = convert(int,8),
length = convert(int,8),
scale = convert(smallint, NULL),
pseudo_column = convert(smallint,1)
FROM
systypes t, syscolumns c, master.dbo.spt_datatype_info d
WHERE
c.id = @table_id
AND c.type = d.ss_dtype
AND c.usertype = 80 /* TIMESTAMP */
AND t.usertype = 80 /* TIMESTAMP */
RETURN
END
/* ROWID, now find the id of the 'best' index for this table */
IF @nullable = 'O' /* Don't include any indexes that contain
nullable columns. */
SELECT @indid = MIN(indid)
FROM sysindexes i,syscolumns c,syscolumns c2
WHERE
i.status&2 = 2 /* If Unique Index */
AND c.id = i.id
AND c2.id = c.id
AND c2.colid < i.keycnt + (i.status&16)/16
AND i.id = @table_id
AND indid > 0 /* Eliminate Table Row */
AND c.name = index_col(@table_name,i.indid,c2.colid)
GROUP BY indid HAVING SUM(c.status&8) = 0
ELSE /* Include indexes that are partially nullable. */
SELECT @indid = MIN(indid)
FROM sysindexes i
WHERE
status&2 = 2 /* If Unique Index */
AND id = @table_id
AND indid > 0 /* Eliminate Table Row */
SELECT
scope = @scopeout,
column_name = INDEX_COL(@full_table_name,indid,c.colid),
data_type = d.data_type+convert(smallint,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c2.length,1))
-60)),
type_name = rtrim(substring(d.type_name,
1+isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c2.length,
1))-60), 13)),
"precision" = isnull(d.data_precision, convert(int,c2.length))
+isnull(d.aux, convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('???AAAFFFCKFOLS',
2*(d.ss_dtype%35+1)+2-8/c2.length,1))-60)),
length = isnull(d.length, convert(int,c2.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c2.length,
1))-64)),
scale = d.numeric_scale +convert(smallint,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('<<<<<<<<<<<<<<?',
2*(d.ss_dtype%35+1)+2-8/c2.length,
1))-60)),
pseudo_column = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
x.id = @table_id
AND c2.name = INDEX_COL(@full_table_name,@indid,c.colid)
AND c2.id =x.id
AND c.id = x.id
AND c.colid < keycnt+(x.status&16)/16
AND x.indid = @indid
AND c2.type = d.ss_dtype
AND c2.usertype *= t.usertype
go
if (charindex('6.00', @@version) = 0)
begin
print ''
print ''
print 'Warning:'
print 'you are installing the stored procedures '
print 'on a pre 6.0 SQL Server.'
print 'Ignore the following errors.'
end
else
drop proc sp_special_columns
go
/* Procedure for 6.0 server */
CREATE PROCEDURE sp_special_columns (
@table_name varchar(32),
@table_owner varchar(32) = null,
@table_qualifier varchar(32) = null,
@col_type char(1) = 'R',
@scope char(1) = 'T',
@nullable char(1) = 'U')
AS
DECLARE @indid int
DECLARE @table_id int
DECLARE @full_table_name char(70)
DECLARE @msg char(70)
DECLARE @scopeout smallint
if @col_type not in ('R','V')
begin
raiserror (15251,-1,-1,'col_type','''R'' or ''V''')
return
end
if @scope = 'C'
select @scopeout = 0
else if @scope = 'T'
select @scopeout = 1
else
begin
raiserror (15251,-1,-1,'scope','''C'' or ''T''')
return
end
if @nullable not in ('U','O')
begin
raiserror (15251,-1,-1,'nullable','''U'' or ''O''')
return
end
if @table_qualifier is not null
begin
if db_name() != @table_qualifier
begin /* If qualifier doesn't match current database */
raiserror (15250, -1,-1,'Table')
return
end
end
if @table_owner is null
begin /* If unqualified table name */
SELECT @full_table_name = @table_name
end
else
begin /* Qualified table name */
SELECT @full_table_name = @table_owner + '.' + @table_name
end
/* Get Object ID */
SELECT @table_id = object_id(@full_table_name)
if @col_type = 'V'
BEGIN /* if ROWVER, just run that query */
SELECT
scope = convert(smallint,NULL),
column_name = c.name,
data_type = convert(smallint, -2),
type_name = t.name,
"precision" = convert(int,8),
length = convert(int,8),
scale = convert(smallint, NULL),
pseudo_column = convert(smallint,1)
FROM
systypes t, syscolumns c, master.dbo.spt_datatype_info d
WHERE
c.id = @table_id
AND c.type = d.ss_dtype
AND c.usertype = 80 /* TIMESTAMP */
AND t.usertype = 80 /* TIMESTAMP */
RETURN
END
/* ROWID, now find the id of the 'best' index for this table */
IF @nullable = 'O' /* Don't include any indexes that contain
nullable columns. */
SELECT @indid = MIN(indid)
FROM sysindexes i,syscolumns c,syscolumns c2
WHERE
i.status&2 = 2 /* If Unique Index */
AND c.id = i.id
AND c2.id = c.id
AND c2.colid < i.keycnt + (i.status&16)/16
AND i.id = @table_id
AND indid > 0 /* Eliminate Table Row */
AND c.name = index_col(@table_name,i.indid,c2.colid)
GROUP BY indid HAVING SUM(c.status&8) = 0
ELSE /* Include indexes that are partially nullable. */
SELECT @indid = MIN(indid)
FROM sysindexes i
WHERE
status&2 = 2 /* If Unique Index */
AND id = @table_id
AND indid > 0 /* Eliminate Table Row */
SELECT /* INTn, FLOATn, DATETIMEn and MONEYn types */
scope = @scopeout,
column_name = INDEX_COL(@full_table_name,indid,c2.colid),
data_type = d.data_type+convert(smallint,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('666AAA@@@CB??GG',
2*(d.ss_dtype%35+1)+2-8/c.length,1))
-60),
type_name = rtrim(substring(d.type_name,
1+
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('III<<<MMMI<<A<A',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-60, 13)),
"precision" = convert(int,c.prec),
length = d.length + convert(int,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64),
scale = convert(smallint, c.scale),
pseudo_column = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < x.keycnt+(x.status&16)/16
AND x.indid = @indid
AND c.type = d.ss_dtype
AND c.usertype = t.usertype
AND d.ss_dtype IN (111, 109, 38, 110) /* Just *N types */
AND c.usertype < 100 /* No user defined types */
UNION ALL
SELECT /* Identity base and decimal/numeric types */
scope = @scopeout,
column_name = INDEX_COL(@full_table_name,indid,c2.colid),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = d.type_name,
"precision" = convert(int,c.prec),
length = convert(int,c.length) +
(convert(int,(c.type & 2)/2) |
(convert(int,c.type&64)/64))*(c.prec+2 - c.length),
scale = convert(smallint, c.scale),
pseudo_column = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < x.keycnt+(x.status&16)/16
AND x.indid = @indid
AND c.type = d.ss_dtype
AND d.auto_increment = (c.status&128)/128
AND c.usertype = t.usertype
AND ((c.usertype < 100 /* Only base types */
AND c.status&128 = 128) /* Identity types only */
OR d.ss_dtype IN (106, 108, 55, 63)) /* decimal/numeric types */
UNION ALL
SELECT /* All other types including user data types */
scope = @scopeout,
column_name = INDEX_COL(@full_table_name,indid,c2.colid),
data_type = convert(smallint,
/* Map systypes.type to ODBC type */
/* SS-Type " 1 1 1 "*/
/* "33 3030 4 44 5 5 255 556666"*/
/* "45 7698 5 78 0 2 256 890123"*/
ascii(substring('8;<9?H><<<<:<=6<5<A<??@<GC?GB>',
t.type%34+1,1))-60),
type_name = t.name,
"precision" = isnull(convert(int,c.prec), 2147483647),
length = isnull(d.length, convert(int,c.length)) +convert(int,
isnull(d.aux,
/* " I I I FFMMDD" */
/* " 1 2 4 484848" */
ascii(substring('AAA<BB<DDDHLUPP',
2*(d.ss_dtype%35+1)+2-8/c.length,
1))-64)),
scale = convert(smallint, c.scale),
pseudo_column = convert(smallint,1)
FROM
sysindexes x,
syscolumns c,
master.dbo.spt_datatype_info d,
systypes t,
syscolumns c2 /* Self-join to generate list of index columns and */
/* to extract datatype names */
WHERE
x.id = @table_id
AND c.name = INDEX_COL(@full_table_name,@indid,c2.colid)
AND c.id = x.id
AND c2.id = x.id
AND c2.colid < x.keycnt+(x.status&16)/16
AND x.indid = @indid
AND c.type = d.ss_dtype
AND isnull(d.auto_increment,0) = 0
AND (c.status&128 = 0 /* No Identity types unless */
OR c.usertype >= 100) /* User defined type */
AND c.usertype *= t.usertype
AND (d.ss_dtype NOT IN (111, 109, 38, 110) /* No *N types */
OR c.usertype >= 100) /* User defined types */
AND d.ss_dtype NOT IN (106, 108, 55, 63) /* No decimal/numeric types */
go
grant execute on sp_special_columns to public
go
print 'creating sp_databases'
go
create proc sp_databases
as
/* Use temporary table to sum up database size w/o using group by */
create table #databases (
database_name varchar(32) NOT NULL,
size int NOT NULL)
/* Insert row for each database */
insert into #databases
select
name,
(select sum(size) from master.dbo.sysusages
where dbid = d.dbid)
from master.dbo.sysdatabases d
select
database_name,
database_size = size*2, /* Convert from 2048 byte pages to K */
remarks = convert(varchar(254),null) /* Remarks are NULL */
from #databases
order by database_name
go
grant execute on sp_databases to public
go
if exists (select * from sysobjects where name = 'sp_configure'
and sysstat & 0xf = 4)
begin
exec sp_configure 'allow updates',0
reconfigure with override
end
go
if exists (select * from sysobjects where name = 'sp_check_objects'
and sysstat & 0xf = 4)
begin
/* Only supported on 6.0 servers */
print ''
print 'Checking objects created by instcat.sql.'
exec sp_check_objects 'catalog'
end
go
print ''
print 'inscat.sql completed successfully.'
go
dump tran master with no_log
go
checkpoint
go